package com.pxmeta.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pxmeta.chat.entity.dto.SetDisturbDTO;
import com.pxmeta.user.entity.User;
import com.pxmeta.user.entity.dto.UpdateUserAccountDTO;
import com.pxmeta.user.entity.dto.UpdateUserNumberDTO;
import com.pxmeta.user.entity.dto.UserDTO;
import com.pxmeta.user.entity.vo.RecommendUserVO;
import com.pxmeta.user.entity.vo.ShareUserVO;
import com.pxmeta.user.entity.vo.SubordinateUserVO;
import com.pxmeta.user.entity.vo.UserVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 用户Service接口
 *
 * @author wcl
 * @date 2022-03-20
 */
public interface IUserService extends IService<User> {


    /**
     * 获取用户详情
     *
     * @param userId
     * @return
     */
    UserDTO getUserInfo(Long currentUserId, Long userId);


    /**
     * 获取用户列表
     *
     * @param currentUserId
     * @return
     */
    List<UserDTO> getUserInfos(Long currentUserId, List<Long> userIds);

    /**
     * 登录接口，如果没有账号则注册
     *
     * @param phone
     * @param password
     */
    User saveUser(String phone, String password, Long parentUserId);

    User saveUser(String phone, String password);

    /**
     * 搭讪
     * @param username
     * @param sex
     */
    void accost(String username, Integer sex);


    User saveUserByWx(String name,String unionId, String password, String avatar);


    /**
     * 注销账号
     *
     * @param userId
     */
    void cancelAccount(Long userId);

    UserVO getUserVO(Long mailUserId);

    List<UserVO> getUserVOList(List<Long> userIds);

    List<UserVO> getUserVOListByUsername(List<Integer> usernames);

    List<UserVO> getUsersByUsernames(List<String> usernames);

    User getByUsername(String username);

    /**
     * 屏蔽用户
     *
     * @param userId
     * @param dto
     */
    void disturbCircle(Long userId, SetDisturbDTO dto);

    /**
     * 获取机器人ID列表
     *
     * @return
     */
    List<Long> getRobotIds();

    /**
     * 获取用户列表
     *
     * @param page
     * @param beginTime
     * @param endTime
     * @return
     */
    IPage<User> getUserList(IPage<User> page, Date beginTime, Date endTime);

    /**
     * 根据手机号查询用户是否存在
     * @param phone
     * @return
     */
    Boolean getUserExistByPhone(String phone);

    public String getUsername();

    User saveUserByApple(String appleId, String defaultPassword);

    List<RecommendUserVO> getRecommendUsers(Long userId, Double userLng, Double userLat);

    void createVoiceCard(Long userId, String voiceUrl, String imgUrl);

    List<UserDTO> getVoiceMatchList(Long userId);

    /**
     * 扣除余额
     * @param userId
     * @param number
     */
    void subBalance(Long userId, BigDecimal number);


    /**
     * 增加余额
     * @param userId
     * @param number
     */
    void addBalance(Long userId, BigDecimal number);


    /**
     * 增加收益
     * @param userId
     * @param number
     */
    void increaseProfit(Long userId, BigDecimal number);


    /**
     * 减少收益
     * @param userId
     * @param number
     */
    void subProfit(Long userId, BigDecimal number);

    /**
     * 根据用户名批量获取用户
     * @param usernames
     * @return
     */
    List<User> batchByUsernames(List<String> usernames);


    /**
     *  扣除余额
     * @param userId
     * @param price
     */
    void subBalance(Long userId, Integer price);

    /**
     * 获取下级用户列表
     * @param page
     * @param size
     * @return
     */
    IPage<SubordinateUserVO> getSubordinateUsers(String phone, Integer page, Integer size);

    /**
     * 获取总分成
     * @param phone
     * @return
     */
    Double getTotalCommission(String phone);

    /**
     * 保存地理位置
     * @param userId
     * @param add
     */
    void saveAddress(Long userId, String add);

    /**
     * 绑定用户关系
     * @param phone
     * @param defaultPassword
     */
    void bindUser(String phone, String defaultPassword, Long parentUserId);

    List<ShareUserVO> getByParentId(Long parentUserId, Integer page, Integer size);

    /**
     * 获取分享总数
     * @param userId
     * @return
     */
    Long getSubordinateCount(Long userId);

    /**
     * 搜索用户
     * @param page
     * @param size
     * @param keyword
     * @return
     */
    IPage<User> searchUser(Integer page, Integer size, String keyword);

    User getByInviteCode(String inviteCode);

    /**
     * 绑定邀请码
     * @param inviteCode
     */
    void bindUserByInviteCode(Long currentUserId, String inviteCode);

    /**
     * 获取分享周收益
     * @param phone
     * @return
     */
    Double getWeekCommission(String phone);

    List<User> getFindObjectUserList(String addr, Integer page, Integer size);


    User getByAccount(String username);

    /**
     * 修改余额
     * @param dto
     */
    void updateBalance(UpdateUserNumberDTO dto);

    /**
     * 修改收益
     * @param dto
     */
    void updateProfit(UpdateUserNumberDTO dto);

    /**
     * 根据手机号获取用户
     * @param phone
     * @return
     */
    User getByPhone(String phone);

    /**
     * 修改用户账号
     * @param dto
     */
    void updateUserAccount(UpdateUserAccountDTO dto);

    List<User> listByUsernames(List<String> usernames);

    void subAdAstraBalance(Long userId, int totalCount);
}
